iT邦幫忙

6

ChatGPT + LineBot + Vercel +Github+Python +flask 串起LINE聊天機器人

  • 分享至 

  • xImage
  •  

LINE聊天機器人,真的不太好設定一個步驟有錯都會卡關,我亦弄好久才得到初體驗,分享給大家
參考來自
https://vocus.cc/article/639da520fd89780001e965d7
詳細步驟流程:
1.取得OPEN API KEY(需自行設定取得)
2.LineBot Channel access token 、Channel secret(需自行設定取得)
3.Vercel 匯入 GitHub 原碼 (建議用GitHub建Vercel 帳號)
4.GitHub 原碼部分(上傳以下三個檔案到自已 GitHub)
index.py

from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from api.chatgpt import ChatGPT

import os

line_bot_api = LineBotApi(os.getenv("LINE_CHANNEL_ACCESS_TOKEN"))
line_handler = WebhookHandler(os.getenv("LINE_CHANNEL_SECRET"))
working_status = os.getenv("DEFALUT_TALKING", default = "true").lower() == "true"

app = Flask(__name__)
chatgpt = ChatGPT()

# domain root
@app.route('/')
def home():
    return 'Hello, World!'

@app.route("/webhook", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']
    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    # handle webhook body
    try:
        line_handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'


@line_handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    global working_status
    working_status = True
    
    if event.message.type != "text":
        return
    

    if working_status:
        chatgpt.add_msg(f"Human:{event.message.text}?\n")
        reply_msg = chatgpt.get_response().replace("AI:", "", 1)
        chatgpt.add_msg(f"AI:{reply_msg}\n")
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=reply_msg))


if __name__ == "__main__":
    app.run()

chatgpt.py

from api.prompt import Prompt

import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

class ChatGPT:
    def __init__(self):
        self.prompt = Prompt()
        self.model = os.getenv("OPENAI_MODEL", default = "text-davinci-003")
        #self.model = os.getenv("OPENAI_MODEL", default = "chatbot")
        self.temperature = float(os.getenv("OPENAI_TEMPERATURE", default = 0))
        self.frequency_penalty = float(os.getenv("OPENAI_FREQUENCY_PENALTY", default = 0))
        self.presence_penalty = float(os.getenv("OPENAI_PRESENCE_PENALTY", default = 0.6))
        self.max_tokens = int(os.getenv("OPENAI_MAX_TOKENS", default = 240))

    def get_response(self):
        response = openai.Completion.create(
            model=self.model,
            prompt=self.prompt.generate_prompt(),
            temperature=self.temperature,
            frequency_penalty=self.frequency_penalty,
            presence_penalty=self.presence_penalty,
            max_tokens=self.max_tokens
        )
        return response['choices'][0]['text'].strip()

    def add_msg(self, text):
        self.prompt.add_msg(text)

prompt.py

import os

chat_language = os.getenv("INIT_LANGUAGE", default = "zh")

MSG_LIST_LIMIT = int(os.getenv("MSG_LIST_LIMIT", default = 20))
LANGUAGE_TABLE = {
  "zh": "嗨!",
  "en": "Hi!"
}

class Prompt:
    def __init__(self):
        self.msg_list = []
        self.msg_list.append(f"AI:{LANGUAGE_TABLE[chat_language]}")
    
    def add_msg(self, new_msg):
        if len(self.msg_list) >= MSG_LIST_LIMIT:
            self.remove_msg()
        self.msg_list.append(new_msg)

    def remove_msg(self):
        self.msg_list.pop(0)

    def generate_prompt(self):
        return '\n'.join(self.msg_list)

5.Vercel Environment Variables 環境設定(帶入PYTHON 參數)
https://ithelp.ithome.com.tw/upload/images/20230214/20136076jy3C6alFZI.png
6.LineBot Webhook(一定要有成功畫面)
https://ithelp.ithome.com.tw/upload/images/20230214/20136076Af2Pi8qHDu.png

當以上這麼多設定都成功後便會得到以下Line BOT 回應,成為真正的LINE聊天機器人,我試很久才弄出來如下:
https://ithelp.ithome.com.tw/upload/images/20230214/20136076mOyi79RqlK.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
Wayne
iT邦新手 4 級 ‧ 2023-02-20 10:43:54

Vercel 免費版(Hobby),Severless Function的執行時間只有10秒,問一些要回答比較長篇的問題就timeout了...哭

/images/emoticon/emoticon02.gif

沒錯我試的狀況跟您一樣/images/emoticon/emoticon02.gif

Wayne iT邦新手 4 級 ‧ 2023-02-20 17:37:11 檢舉

身為免費仔的痛 /images/emoticon/emoticon02.gif

對啊,同感,Facebook 都聽說要收費了

1
lalelee
iT邦新手 4 級 ‧ 2023-02-21 10:59:36

J大 您好,請問一下我在vercel上面domain是"chargpt-linebot.vercel.app",
然後在Webhook那邊設定的網址是"https://chargpt-linebot.vercel.app/webhook/" 但是verify會出現404,不是200,
我vercel.json 和 requirement.txt 都放在根目錄底下,
請問可能是什麼問題?

感謝你花時間 幫我看問題 我也是業餘愛好者 謝謝

你要從github fork到你自己的github 才不會有問題,vercel也要加入github才會成功

lalelee iT邦新手 4 級 ‧ 2023-02-23 11:28:23 檢舉

我的GitHUB結構長這樣:https://i.imgur.com/qx3TawV.png , vercel已經有link到自己的GitHUB, 但還是出現404, 我的vercel.json 位置是不是不對 ? 謝謝

0
allenwu
iT邦新手 5 級 ‧ 2023-04-20 17:13:30

想問一下大大因為最近OpenAI試用期限應該到期需要綁定付款了,想請問各位先進有成功綁定台灣信用卡了嗎?目前測試使用幾張都被拒絕了

有查到這篇文章說明需要在同一個國家才能成功綁定信用卡支付,我人和信用卡申請都是在台灣所以沒有所在地出入問題,所以想確認一下有沒有大大已經成功解決相關疑問,也有同步寫信向OpenAI support反應這個問題了
https://community.openai.com/.../credit-and-debit.../58952

您好的確要開始收費了,但目前個人尚未使用付款機制

allenwu iT邦新手 5 級 ‧ 2023-04-26 15:06:57 檢舉

感謝回覆!之後使用其他國際銀行的台灣分行信用卡有成功付款了,如果有遇到同樣問題,可以多試幾張信用卡試試

了解感謝

我要留言

立即登入留言